www.gusucode.com > matlab神经网络原理与实例精解 本书源文件 > 第8章 自组织竞争神经网络/mykohonen.m

    % mykohonen.m

%% 清空环境变量
clc,clear
close all

%% 样本数据
x0=[4.1,1.8,0.5,2.9,4.0,0.6,3.8,4.3,3.2,1.0,3.0,3.6,3.8,3.7,3.7,8.6,9.1,...
    7.5,8.1,9.0,6.9,8.6,8.5,9.6,10.0,9.3,6.9,6.4,6.7,8.7;...
    8.1,5.8,8.0,5.2,7.1,7.3,8.1,6.0,7.2,8.3,7.4,7.8,7.0,6.4,8.0,...
    3.5,2.9,3.8,3.9,2.6,4.0,2.9,3.2,4.9,3.5,3.3,5.5,5.0,4.4,4.3];

%数据归一化
[x,m_x]=mapminmax(x0);
x=x';
[nn,mm]=size(x);

%% 参数
rng(0)
%学习率
rate1max=0.8;
rate1min=0.05;
%学习半径
r1max=3;
r1min=0.8;

%% 网络构建
Inum=2;
% M=1;
M=2;
N=2;
K=M*N;          %Kohonen总节点数  
k=1;            %Kohonen层节点排序
jdpx=zeros(M*N,2);
for i=1:M
    for j=1:N
        jdpx(k,:)=[i,j];
        k=k+1;
    end
end

%权值初始化
w1=rand(Inum,K); %第一层权值

%% 迭代求解
ITER=200;
for i=1:ITER
    
    %自适应学习率和相应半径
    rate1=rate1max-i/ITER*(rate1max-rate1min);
    r=r1max-i/ITER*(r1max-r1min);
    
    %随机抽取一个样本
    k=randi(30);
    xx=x(k,:);
    
    %计算最优节点
    [mindist,index]=min(dist(xx,w1));
    
    %计算临域
    d1=ceil(index/4);
    d2=mod(index,4);
    nodeindex=find(dist([d1,d2],jdpx')<r);
    
    %内星规则
    for j=1:K
        if sum(nodeindex==j)
            w1(:,j)=w1(:,j)+rate1*(xx'-w1(:,j));
        end
    end
end

%% 测试
Index=zeros(1,30);
for i=1:30
    [mindist,Index(i)]=min(dist(x(i,:),w1));
end

%% 显示
x1=x0(:,Index==1);
x2=x0(:,Index==2);
x3=x0(:,Index==3);
x4=x0(:,Index==4);
plot(x1(1,:),x1(2,:),'ro');hold on
plot(x2(1,:),x2(2,:),'k*');
plot(x3(1,:),x3(2,:),'b>');
plot(x4(1,:),x4(2,:),'mp');
title('聚类结果')
legend('类别1','类别2','类别3','类别4')
% legend('类别1','类别2')
set(gcf,'color','w')
box on